package com.sunni.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyTarget {
    public static void main(String[] args) {

        // 1.建目标对象
        final Target target = new Target();

        // 3.创建 放增强方法的对象
        final Advice advice = new Advice();

        //2. 生成代理对象 (里面是代理对象的运行规则: ) (利用目标对象)

        TargetInterface proxyTarget = (TargetInterface) Proxy.newProxyInstance(/*多态 代理对象和目标对象都实现了接口   所以用接口类型 多态*/
                target.getClass().getClassLoader(), // 2.1 目标对象类加载器
                target.getClass().getInterfaces(),  // 2.2 目标对象的接口
                new InvocationHandler() {       // 2.3 设置代理类(内部)的运行规则  (组装 目标方法+)
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        /*代理对象 运行规则 ：目标方法+增强方法*/
                        advice.before(); // 2.3.1 组装(前置)增强方法
                        Object invoke = method.invoke(target, args);// 2.3.2 执行 目标方法
                        advice.after(); // 2.3.3. 组装(后置)增强方法
                        return invoke; // 返回(这个规则的)代理对象
                    }
                }
        );

        // 4. 测试
        proxyTarget.save();
    }
}
